Jira Code: AHD-44
This script is used to get the data from the AWS and updating the Delivery Orders with the statuses and other information included in that file. If the file size is above 30000 it will redirect to the map-reduce script. We are taking each file and update the fields with the information, after completing the field update it will delete the file from the AWS folder ‘CLI-Statuses’ and updated in another folder ‘CLI-Status_Processed’.
/**
* @NApiVersion 2.x
* @NScriptType ScheduledScript
* @NModuleScope SameAccount
*/
/*******************************************************************************
*
* AHD-44 SS CLI-Status
*
* *******************************************************************************
*
* Date: 15-02-2019
*
* Description:This script is used to get the data from the AWS and updating the
* Delivery Orders with the statuses and other information included in that file.
* If the file size is above 30000 it will redirect to the map reduce script.
* We are taking each file and update the fields with the information after
* completing the field update it will delete the file from the AWS folder 'CLI-Statuses'
* and updated in another folder 'CLI-Status_Processed' .
*
* Author: Jobin & Jismi IT Services LLP
*
*****************************************************************************
**/
define(['N/email', 'N/file', 'N/url', 'N/http', 'N/record', 'N/runtime', 'N/search', 'N/https', 'N/task', 'N/render'],
/**
* @param {email} email
* @param {http} http
* @param {https} https
* @param {record} record
* @param {runtime} runtime
* @param {search} search
* @param {url} url
*/
function (email, file, url, http, record, runtime, search, https, task, render) {
/**
* Definition of the Scheduled script trigger point.
*
* @param {Object} scriptContext
* @param {string} scriptContext.type - The context in which the script is executed. It is one of the values from the scriptContext.InvocationType enum.
* @Since 2015.2
*/
var main = {
execute: function (scriptContext) {
var orderObjects = main.fetchObjects();
var fileidarray = [];
var loadfileObj, singlePurchaseOrder, locPath, deletesSinglePurchaseOrder, uploadResponse;
for (var i = 0; i < 1; i++) {
if (((orderObjects[Object.keys(orderObjects)[i]]).toString()).search('xml') > (-1)) {
// neglect XML files
continue;
}
locPath = (orderObjects[Object.keys(orderObjects)[i]]).split("CLI-Statuses/")[1];
//If no JSON file is found in File Cabinet,then Create sales order
singlePurchaseOrder = main.fetchAnObject(orderObjects[Object.keys(orderObjects)[i]]);
singlePurchaseOrder = JSON.parse(singlePurchaseOrder);
salesID = main.createdeliveryid(singlePurchaseOrder, locPath, fileidarray);
fileidarray.push(salesID)
}
//Create the file which has fileid of the JSON from AWS.
var filearray = file.create({
name: "statusupdate.txt",
fileType: file.Type.PLAINTEXT,
contents: fileidarray
});
filearray.folder = 900;
var filearrayid = filearray.save();
for (var k = 0; k < fileidarray.length; k++) {
//Create Call for Delivery Order from the JSON file.
var deliveryorder = main.updatedeliveryorder(singlePurchaseOrder, locPath, fileidarray[k]);
}
//Reschedule the process
var remainingUsage = runtime.getCurrentScript().getRemainingUsage();
var mrTask = task.create({
taskType: task.TaskType.SCHEDULED_SCRIPT,
scriptId: "customscript_jj_ss_cli_status",
deploymentId: "customdeploy_jj_ss_cli_status",
});
var scriptTaskId = mrTask.submit();
log.debug("rescheduleScriptandReturn_scriptTaskId", remainingUsage);
return;
},
updatedeliveryorder: function (singlePurchaseOrder, locPath, salesID) {
var fileget = file.load({
id: salesID
});
log.debug("size", fileget.size)
if (fileget.size > 30000) {
var scheduleScrptTask = task.create({
taskType: task.TaskType.MAP_REDUCE,
scriptId: "customscript_jj_mu_cli_status",
deploymentId: 'customdeploy_jj_mu_cli_status',
params: {
custscript_jj_json_fileid: salesID
}
});
scheduleScrptTask.submit();
} else {
var contantarray = JSON.parse(fileget.getContents());
var statusobj = main.statusobject()
var lengthofArray = contantarray.length
for (a = 0; a < lengthofArray; a++) {
var orderdetails = contantarray[a]
var ordernumber = orderdetails.ShipmentNumber.split("-")
if (orderdetails.Status == "DET" || orderdetails.Status == "CREATE" || orderdetails.Status == "MER" || orderdetails.Status == "INT" || orderdetails.Status == "RED" || orderdetails.Occurred == "MANIFEST") {
var transactionSearch = search.create({
type: "salesorder",
filters: [
["type", "anyof", "SalesOrd"],
"AND",
["numbertext", "is", ordernumber[0]]
],
columns: [
search.createColumn({
name: "internalid",
label: "Internal ID"
})
]
});
var searchResultCount = transactionSearch.runPaged().count;
var doId;
if (searchResultCount > 0) {
var result = transactionSearch.run().getRange(0, 1);
var doId = result[0].getValue({
name: "internalid",
label: "Internal ID"
});
try {
log.debug("doId", doId)
var deliveryorder = record.load({
id: doId,
type: record.Type.SALES_ORDER
});
var updateStatusDate = main.getdate(orderdetails.StatusDate)
if (orderdetails.Occurred == "MANIFEST") {
var manifnumber = deliveryorder.getValue({
fieldId: 'custbody_cl_manifest_number'
});
if (manifnumber == undefined || manifnumber == null || manifnumber == "") {
manifnumber = orderdetails.ManifestNumber
} else {
manifnumber = manifnumber + " , " + orderdetails.ManifestNumber
}
deliveryorder.setValue({
fieldId: 'custbody_cl_manifest_number',
value: manifnumber
});
} else {
}
if (orderdetails.Status == "MER" || orderdetails.Status == "RED") {
var stat = statusobj[orderdetails.Status]
var linenumber = deliveryorder.getLineCount({
sublistId: 'item'
});
if (orderdetails.Status == "MER") {
for (var a = 0; a < linenumber; a++) {
deliveryorder.setSublistValue({
sublistId: 'item',
fieldId: 'custcol_item_level_statuses',
line: a,
value: 11
});
}
deliveryorder.setValue({
fieldId: 'custbody_order_level_status',
value: 15
});
var mer_date = deliveryorder.getValue({
fieldId: 'custbody_cl_mer_date'
});
if (mer_date == null || mer_date == undefined || mer_date == "") {
deliveryorder.setValue({
fieldId: 'custbody_cl_mer_date',
value: new Date(updateStatusDate)
});
}
}
if (orderdetails.Status == "RED") {
for (var a = 0; a < linenumber; a++) {
deliveryorder.setSublistValue({
sublistId: 'item',
fieldId: 'custcol_item_level_statuses',
line: a,
value: 15
});
}
deliveryorder.setValue({
fieldId: 'custbody_order_level_status',
value: 32
});
var red_date = deliveryorder.getValue({
fieldId: 'custbody_cl_red_date'
});
if (red_date == null || red_date == undefined || red_date == "") {
deliveryorder.setValue({
fieldId: 'custbody_cl_red_date',
value: new Date(updateStatusDate)
});
}
}
deliveryorder.setValue({
fieldId: 'custbody_first_received_on',
value: new Date(updateStatusDate)
});
deliveryorder.setValue({
fieldId: 'custbody_cl_remarks',
value: orderdetails.Remarks
});
deliveryorder.setValue({
fieldId: 'custbody_cl_trailer',
value: orderdetails.Trailer
});
deliveryorder.setValue({
fieldId: 'custbody_cl_status_time',
value: orderdetails.StatusTime
});
deliveryorder.setValue({
fieldId: 'custbody_cl_status_date',
value: orderdetails.StatusDate
});
deliveryorder.setValue({
fieldId: 'custbody_cl_route',
value: orderdetails.Route
});
}
deliveryorder.setValue({
fieldId: 'custbody_cl_order_history',
value: orderdetails.StatusDate + " | " + orderdetails.StatusTime + " | " + orderdetails.Occurred + " | " + orderdetails.Status + " | " + orderdetails.Route + " | " + orderdetails.Trailer + " | " + orderdetails.Remarks
});
deliveryorder.setValue({
fieldId: 'custbody_cl_json_file',
value: fileget.name
});
var recordId = deliveryorder.save();
log.debug("recordId", recordId)
} catch (error) {
log.debug("error", error.message)
email.send({
author: -5,
recipients: 'anju.m@jobinandjismi.com',
subject: 'Error in status update',
body: error.message + " for " + ordernumber[0] + " for " + fileget.name
});
}
}
}
}
}
fileget.folder = 158259;
fileget.save();
var upload = main.uploadAnObject(salesID, 'CLI-Status_Processed/', locPath)
},
getdate: function (date) {
var date = new Date(date);
var newdate = new Date(date);
newdate.setDate(newdate.getDate() + 1);
var dd = newdate.getDate();
var mm = newdate.getMonth() + 1;
var y = newdate.getFullYear() + 100;
var someFormattedDate = mm + '/' + dd + '/' + y;
return someFormattedDate;
},
statusobject: function (params) {
var statusobj = {}
var customlist_order_level_statusesSearchObj = search.create({
type: "customlist_order_level_statuses",
filters: [
["isinactive", "is", "F"]
],
columns: [
search.createColumn({
name: "name",
sort: search.Sort.ASC,
label: "Name"
}),
search.createColumn({
name: "internalid",
label: "Internal ID"
})
]
});
var searchResultCount = customlist_order_level_statusesSearchObj.runPaged().count;
var searchResult = customlist_order_level_statusesSearchObj.run().getRange(0, 50);
for (var b = 0; b < searchResult.length; b++) {
var name = searchResult[b].getValue({
name: "name",
sort: search.Sort.ASC,
label: "Name"
})
var statusvalue = searchResult[b].getValue({
name: "internalid",
label: "Internal ID"
})
statusobj[name] = statusvalue;
}
return statusobj;
},
createdeliveryid: function (singlePurchaseOrder, locPath, fileidarray) {
//Create JSON file from the AWS.
var JSONdata = JSON.stringify(singlePurchaseOrder);
locPath = locPath.split(".")[0]
var filetosave = file.create({
name: locPath + ".json",
fileType: file.Type.JSON,
contents: JSONdata
});
filetosave.folder = 46950;
var fileid = filetosave.save();
return fileid;
},
//Delete from the AWS CLI-Statuses Folder.
deleteAnObject: function (pathKey) {
var staticObj = main.getAWSAuthObj();
/* CanonicalRequest */
var payload = "";
var CanonicalRequest = "DELETE" + "\n" + //HTTPRequestMethod
encodeURI("/" + pathKey) + "\n" + //CanonicalURI
"\n" + //CanonicalQueryString
"host:amt-orders.s3.amazonaws.com" + "\n" + //CanonicalHeaders
"x-amz-content-sha256:" + CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(payload)).toLowerCase() + "\n" + //CanonicalHeaders
"x-amz-date:" + staticObj.amzDate + "\n" + //CanonicalHeaders
"\n" + //CanonicalHeaders
"host;x-amz-content-sha256;x-amz-date" + "\n" + //SignedHeaders
CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(payload)).toLowerCase(); //HashedPayload;
CanonicalRequest = CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(CanonicalRequest));
/* stringToSign */
var stringToSign = "AWS4-HMAC-SHA256" + "\n" +
staticObj.amzDate + "\n" +
staticObj.authDate + "/" + staticObj.region + "/" + staticObj.serviceName + "/aws4_request" + "\n" +
CanonicalRequest;
/* signingKey */
var signingKey = main.getSignatureKey(staticObj.aws_secret_access_key, staticObj.dateOnly, staticObj.region, staticObj.serviceName);
/* signature */
var signature = CryptoJS.HmacSHA256(stringToSign, signingKey);
signature = CryptoJS.enc.Hex.stringify(signature);
/* authHeader */
var authHeader = "AWS4-HMAC-SHA256" +
" Credential=" + staticObj.aws_access_key_id + "/" + staticObj.authDate + "/" + staticObj.region + "/" + staticObj.serviceName + "/aws4_request," +
" SignedHeaders=host;x-amz-content-sha256;x-amz-date," +
" Signature=" + signature;
/* request */
var response = https.delete({
url: "https://amt-orders.s3.amazonaws.com/" + pathKey,
headers: {
'Authorization': authHeader,
'host': 'amt-orders.s3.amazonaws.com',
'x-amz-content-sha256': CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(payload)).toLowerCase(),
'x-amz-date': staticObj.amzDate
}
});
log.debug("response", response)
/* response.code */
var responseCode = (response.code);
return responseCode;
},
//Upload to the AWS CLI-Status_Processed Folder.
uploadAnObject: function (salesID, pathKey, locPath) {
var staticObj = main.getAWSAuthObj();
var fileget = file.load({
id: salesID
});
var fileobj = (fileget.getContents());
/* CanonicalRequest */
var CanonicalRequest = "PUT" + "\n" + //HTTPRequestMethod
encodeURI("/" + pathKey + fileget.name) + "\n" + //CanonicalURI
"\n" + //CanonicalQueryString
"content-length:" + fileget.size + "\n" + //CanonicalHeaders
"content-type:application/json" + "\n" + //CanonicalHeaders
"expect:100-continue" + "\n" + //CanonicalHeaders
"host:amt-orders.s3.amazonaws.com" + "\n" + //CanonicalHeaders
"x-amz-content-sha256:" + CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(fileobj)).toLowerCase() + "\n" + //CanonicalHeaders
"x-amz-date:" + staticObj.amzDate + "\n" + //CanonicalHeaders
"\n" + //CanonicalHeaders
"content-length;content-type;expect;host;x-amz-content-sha256;x-amz-date" + "\n" + //SignedHeaders
CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(fileobj)).toLowerCase(); //HashedPayload;
CanonicalRequest = CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(CanonicalRequest));
/* stringToSign */
var stringToSign = "AWS4-HMAC-SHA256" + "\n" +
staticObj.amzDate + "\n" +
staticObj.authDate + "/" + staticObj.region + "/" + staticObj.serviceName + "/aws4_request" + "\n" +
CanonicalRequest;
/* signingKey */
var signingKey = main.getSignatureKey(staticObj.aws_secret_access_key, staticObj.dateOnly, staticObj.region, staticObj.serviceName);
/* signature */
var signature = CryptoJS.HmacSHA256(stringToSign, signingKey);
signature = CryptoJS.enc.Hex.stringify(signature);
/* authHeader */
var authHeader = "AWS4-HMAC-SHA256" +
" Credential=" + staticObj.aws_access_key_id + "/" + staticObj.authDate + "/" + staticObj.region + "/" + staticObj.serviceName + "/aws4_request," +
" SignedHeaders=content-length;content-type;expect;host;x-amz-content-sha256;x-amz-date," +
" Signature=" + signature;
/* request */
var response = https.put({
url: "https://amt-orders.s3.amazonaws.com/" + pathKey + fileget.name,
headers: {
'Authorization': authHeader,
'Content-Length': fileget.size,
'Content-Type': 'application/json',
'Expect': '100-continue',
'host': 'amt-orders.s3.amazonaws.com',
'x-amz-content-sha256': CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(fileobj)).toLowerCase(),
'x-amz-date': staticObj.amzDate
},
body: fileobj
});
/* response.code */
var responseCode = (response.code);
main.deleteAnObject("CLI-Statuses/" + fileget.name)
return responseCode;
},
getdate: function (date) {
//get the date in the format
var date = new Date(date);
var newdate = new Date(date);
newdate.setDate(newdate.getDate());
var dd = newdate.getDate();
var mm = newdate.getMonth() + 1;
var y = newdate.getFullYear() + 100;
var someFormattedDate = mm + '/' + dd + '/' + y;
return someFormattedDate;
},
fetchObjects: function () {
var staticObj = main.getAWSAuthObj();
var payload = "";
var CanonicalRequest = "GET" + "\n" + //HTTPRequestMethod
encodeURI("/") + "\n" + //CanonicalURI
encodeURI("list-type") + "=" + encodeURI("2") + "&" + //CanonicalQueryString
encodeURI("max-keys") + "=" + encodeURI("1000") + "&" + //CanonicalQueryString
encodeURI("prefix") + "=" + encodeURI("CLI-Statuses") + //CanonicalQueryString
"\n" + //CanonicalQueryString
"host:amt-orders.s3.amazonaws.com" + "\n" + //CanonicalHeaders
"x-amz-content-sha256:" + CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(payload)).toLowerCase() + "\n" + //CanonicalHeaders
"x-amz-date:" + staticObj.amzDate + "\n" + //CanonicalHeaders
"\n" + //CanonicalHeaders
"host;x-amz-content-sha256;x-amz-date" + "\n" + //SignedHeaders
CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(payload)).toLowerCase(); //HashedPayload;
CanonicalRequest = CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(CanonicalRequest));
var stringToSign = "AWS4-HMAC-SHA256" + "\n" + //Algorithm
staticObj.amzDate + "\n" + //RequestDate
staticObj.authDate + "/" + staticObj.region + "/" + staticObj.serviceName + "/aws4_request" + "\n" + //CredentialScope
CanonicalRequest; //HashedCanonicalRequest
/* signingKey */
var signingKey = main.getSignatureKey(staticObj.aws_secret_access_key, staticObj.dateOnly, staticObj.region, staticObj.serviceName);
/* signature */
var signature = CryptoJS.HmacSHA256(stringToSign, signingKey);
signature = CryptoJS.enc.Hex.stringify(signature);
/* authHeader */
var authHeader = "AWS4-HMAC-SHA256" +
" Credential=" + staticObj.aws_access_key_id + "/" + staticObj.authDate + "/" + staticObj.region + "/" + staticObj.serviceName + "/aws4_request," +
" SignedHeaders=host;x-amz-content-sha256;x-amz-date," +
" Signature=" + signature;
/* request */
var response = https.get({
url: "https://amt-orders.s3.amazonaws.com?list-type=2&max-keys=1000&prefix=CLI-Statuses",
headers: {
'Authorization': authHeader,
'host': 'amt-orders.s3.amazonaws.com',
'x-amz-content-sha256': CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(payload)).toLowerCase(),
'x-amz-date': staticObj.amzDate
}
});
/* response.body */
var XMLdata = (response.body).toString();
//to split data between <Key> and </Key> and store it in Array
var XMLArray = new Array();
var pos = 0;
XMLArray = XMLdata.split('<Key>');
while (pos < XMLArray.length) {
if (XMLArray[pos].split('</Key>')[0]) {
XMLArray[pos] = XMLArray[pos].split('</Key>')[0];
}
pos++;
}
var prefixName = "CLI-Statuses";
//To create an Object with Key as 'PO**' number and value as 'PO**' path
var XMLcontent, XMLkey;
var XMLObject = new Object();
pos = 2;
while (pos < XMLArray.length) {
XMLkey = (XMLArray[pos].split(prefixName + '/')[1].split('.json')[0]) || (XMLArray[pos].split(prefixName + '/')[1].split('.JSON')[0]);
XMLcontent = XMLArray[pos];
XMLObject[XMLkey] = XMLcontent;
pos++;
}
log.debug("XMLOb", XMLObject);
return XMLObject;
},
getAWSAuthObj: function () {
var currentDate = new Date();
var dateStampISOConverted = currentDate.toISOString();
while (dateStampISOConverted.indexOf('-') > (-1)) {
dateStampISOConverted = dateStampISOConverted.replace("-", "");
}
while (dateStampISOConverted.indexOf(':') > (-1)) {
dateStampISOConverted = dateStampISOConverted.replace(":", "");
}
dateStampISOConverted = dateStampISOConverted.split(".")[0] + "Z";
var dateOnly = (currentDate.toISOString()).split("T")[0];
while (dateOnly.search('-') > (-1)) {
dateOnly = dateOnly.replace("-", "");
}
var staticAWSDetilsObj = {
"aws_access_key_id": "AKIAIXZ3UWDMZ3K45VPA",
"aws_secret_access_key": "lTE1gXlzOZmJwXgpQlPx+r0ezEycZ2Qmz6L8Emob",
"bucket": "amt-orders",
"region": "us-east-1",
"serviceName": "s3",
"currentDate": currentDate,
"parseDate": Date.parse(currentDate),
"dateStampISO": currentDate.toISOString(),
"dateStampUTC": currentDate.toUTCString(),
"dateString": currentDate.toString(),
"dateStampISOConverted": dateStampISOConverted,
"dateOnly": dateOnly,
"amzDate": dateStampISOConverted,
"authDate": dateOnly
};
return staticAWSDetilsObj;
},
getSignatureKey: function (key, dateStamp, regionName, serviceName) {
var kDate = CryptoJS.HmacSHA256(dateStamp, "AWS4" + key);
var kRegion = CryptoJS.HmacSHA256(regionName, kDate);
var kService = CryptoJS.HmacSHA256(serviceName, kRegion);
var kSigning = CryptoJS.HmacSHA256("aws4_request", kService);
return kSigning;
},
/* to return complete data of specific object in a Bucket */
fetchAnObject: function (pathKey) {
try {
var staticObj = main.getAWSAuthObj();
/* CanonicalRequest */
var payload = "";
var CanonicalRequest = "GET" + "\n" + //HTTPRequestMethod
encodeURI("/" + pathKey) + "\n" + //CanonicalURI
"\n" + //CanonicalQueryString
"host:amt-orders.s3.amazonaws.com" + "\n" + //CanonicalHeaders
"x-amz-content-sha256:" + CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(payload)).toLowerCase() + "\n" + //CanonicalHeaders
"x-amz-date:" + staticObj.amzDate + "\n" + //CanonicalHeaders
"\n" + //CanonicalHeaders
"host;x-amz-content-sha256;x-amz-date" + "\n" + //SignedHeaders
CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(payload)).toLowerCase(); //HashedPayload;
CanonicalRequest = CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(CanonicalRequest));
var stringToSign = "AWS4-HMAC-SHA256" + "\n" + //Algorithm
staticObj.amzDate + "\n" + //RequestDate
staticObj.authDate + "/" + staticObj.region + "/" + staticObj.serviceName + "/aws4_request" + "\n" + //CredentialScope
CanonicalRequest; //HashedCanonicalRequest
/* signingKey */
var signingKey = main.getSignatureKey(staticObj.aws_secret_access_key, staticObj.dateOnly, staticObj.region, staticObj.serviceName);
/* signature */
var signature = CryptoJS.HmacSHA256(stringToSign, signingKey);
signature = CryptoJS.enc.Hex.stringify(signature);
/* authHeader */
var authHeader = "AWS4-HMAC-SHA256" +
" Credential=" + staticObj.aws_access_key_id + "/" + staticObj.authDate + "/" + staticObj.region + "/" + staticObj.serviceName + "/aws4_request," +
" SignedHeaders=host;x-amz-content-sha256;x-amz-date," +
" Signature=" + signature;
var response = https.get({
url: "https://amt-orders.s3.amazonaws.com/" + pathKey,
headers: {
'Authorization': authHeader,
'host': 'amt-orders.s3.amazonaws.com',
'x-amz-content-sha256': CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(payload)).toLowerCase(),
'x-amz-date': staticObj.amzDate
}
});
/* response.body */
var JSONdata = (response.body);
return JSONdata;
} catch (err) {
log.debug(err, 'function fetchAnObject(' + pathKey + ')');
return false;
}
}
}
for (var key in main) {
if (typeof main[key] === 'function') {
main[key] = trycatch(main[key], key);
}
}
function trycatch(myfunction, key) {
return function () {
try {
return myfunction.apply(this, arguments);
} catch (e) {
log.debug("e in " + key, e);
}
}
};
return main;
});
/*******************************************************************************/
/*
* Additional Libraries
*/
/*******************************************************************************/
/*******************************************************************************/
/*
* Encryption Library
* HMAC-SHA256.js
*/
var CryptoJS = CryptoJS || function (h, s) {
var f = {},
g = f.lib = {},
q = function () {},
m = g.Base = {
extend: function (a) {
q.prototype = this;
var c = new q;
a && c.mixIn(a);
c.hasOwnProperty("init") || (c.init = function () {
c.$super.init.apply(this, arguments)
});
c.init.prototype = c;
c.$super = this;
return c
},
create: function () {
var a = this.extend();
a.init.apply(a, arguments);
return a
},
init: function () {},
mixIn: function (a) {
for (var c in a) a.hasOwnProperty(c) && (this[c] = a[c]);
a.hasOwnProperty("toString") && (this.toString = a.toString)
},
clone: function () {
return this.init.prototype.extend(this)
}
},
r = g.WordArray = m.extend({
init: function (a, c) {
a = this.words = a || [];
this.sigBytes = c != s ? c : 4 * a.length
},
toString: function (a) {
return (a || k).stringify(this)
},
concat: function (a) {
var c = this.words,
d = a.words,
b = this.sigBytes;
a = a.sigBytes;
this.clamp();
if (b % 4)
for (var e = 0; e < a; e++) c[b + e >>> 2] |= (d[e >>> 2] >>> 24 - 8 * (e % 4) & 255) << 24 - 8 * ((b + e) % 4);
else if (65535 < d.length)
for (e = 0; e < a; e += 4) c[b + e >>> 2] = d[e >>> 2];
else c.push.apply(c, d);
this.sigBytes += a;
return this
},
clamp: function () {
var a = this.words,
c = this.sigBytes;
a[c >>> 2] &= 4294967295 <<
32 - 8 * (c % 4);
a.length = h.ceil(c / 4)
},
clone: function () {
var a = m.clone.call(this);
a.words = this.words.slice(0);
return a
},
random: function (a) {
for (var c = [], d = 0; d < a; d += 4) c.push(4294967296 * h.random() | 0);
return new r.init(c, a)
}
}),
l = f.enc = {},
k = l.Hex = {
stringify: function (a) {
var c = a.words;
a = a.sigBytes;
for (var d = [], b = 0; b < a; b++) {
var e = c[b >>> 2] >>> 24 - 8 * (b % 4) & 255;
d.push((e >>> 4).toString(16));
d.push((e & 15).toString(16))
}
return d.join("")
},
parse: function (a) {
for (var c = a.length, d = [], b = 0; b < c; b += 2) d[b >>> 3] |= parseInt(a.substr(b,
2), 16) << 24 - 4 * (b % 8);
return new r.init(d, c / 2)
}
},
n = l.Latin1 = {
stringify: function (a) {
var c = a.words;
a = a.sigBytes;
for (var d = [], b = 0; b < a; b++) d.push(String.fromCharCode(c[b >>> 2] >>> 24 - 8 * (b % 4) & 255));
return d.join("")
},
parse: function (a) {
for (var c = a.length, d = [], b = 0; b < c; b++) d[b >>> 2] |= (a.charCodeAt(b) & 255) << 24 - 8 * (b % 4);
return new r.init(d, c)
}
},
j = l.Utf8 = {
stringify: function (a) {
try {
return decodeURIComponent(escape(n.stringify(a)))
} catch (c) {
throw Error("Malformed UTF-8 data");
}
},
parse: function (a) {
return n.parse(unescape(encodeURIComponent(a)))
}
},
u = g.BufferedBlockAlgorithm = m.extend({
reset: function () {
this._data = new r.init;
this._nDataBytes = 0
},
_append: function (a) {
"string" == typeof a && (a = j.parse(a));
this._data.concat(a);
this._nDataBytes += a.sigBytes
},
_process: function (a) {
var c = this._data,
d = c.words,
b = c.sigBytes,
e = this.blockSize,
f = b / (4 * e),
f = a ? h.ceil(f) : h.max((f | 0) - this._minBufferSize, 0);
a = f * e;
b = h.min(4 * a, b);
if (a) {
for (var g = 0; g < a; g += e) this._doProcessBlock(d, g);
g = d.splice(0, a);
c.sigBytes -= b
}
return new r.init(g, b)
},
clone: function () {
var a = m.clone.call(this);
a._data = this._data.clone();
return a
},
_minBufferSize: 0
});
g.Hasher = u.extend({
cfg: m.extend(),
init: function (a) {
this.cfg = this.cfg.extend(a);
this.reset()
},
reset: function () {
u.reset.call(this);
this._doReset()
},
update: function (a) {
this._append(a);
this._process();
return this
},
finalize: function (a) {
a && this._append(a);
return this._doFinalize()
},
blockSize: 16,
_createHelper: function (a) {
return function (c, d) {
return (new a.init(d)).finalize(c)
}
},
_createHmacHelper: function (a) {
return function (c, d) {
return (new t.HMAC.init(a,
d)).finalize(c)
}
}
});
var t = f.algo = {};
return f
}(Math);
(function (h) {
for (var s = CryptoJS, f = s.lib, g = f.WordArray, q = f.Hasher, f = s.algo, m = [], r = [], l = function (a) {
return 4294967296 * (a - (a | 0)) | 0
}, k = 2, n = 0; 64 > n;) {
var j;
a: {
j = k;
for (var u = h.sqrt(j), t = 2; t <= u; t++)
if (!(j % t)) {
j = !1;
break a
}
j = !0
}
j && (8 > n && (m[n] = l(h.pow(k, 0.5))), r[n] = l(h.pow(k, 1 / 3)), n++);
k++
}
var a = [],
f = f.SHA256 = q.extend({
_doReset: function () {
this._hash = new g.init(m.slice(0))
},
_doProcessBlock: function (c, d) {
for (var b = this._hash.words, e = b[0], f = b[1], g = b[2], j = b[3], h = b[4], m = b[5], n = b[6], q = b[7], p = 0; 64 > p; p++) {
if (16 > p) a[p] =
c[d + p] | 0;
else {
var k = a[p - 15],
l = a[p - 2];
a[p] = ((k << 25 | k >>> 7) ^ (k << 14 | k >>> 18) ^ k >>> 3) + a[p - 7] + ((l << 15 | l >>> 17) ^ (l << 13 | l >>> 19) ^ l >>> 10) + a[p - 16]
}
k = q + ((h << 26 | h >>> 6) ^ (h << 21 | h >>> 11) ^ (h << 7 | h >>> 25)) + (h & m ^ ~h & n) + r[p] + a[p];
l = ((e << 30 | e >>> 2) ^ (e << 19 | e >>> 13) ^ (e << 10 | e >>> 22)) + (e & f ^ e & g ^ f & g);
q = n;
n = m;
m = h;
h = j + k | 0;
j = g;
g = f;
f = e;
e = k + l | 0
}
b[0] = b[0] + e | 0;
b[1] = b[1] + f | 0;
b[2] = b[2] + g | 0;
b[3] = b[3] + j | 0;
b[4] = b[4] + h | 0;
b[5] = b[5] + m | 0;
b[6] = b[6] + n | 0;
b[7] = b[7] + q | 0
},
_doFinalize: function () {
var a = this._data,
d = a.words,
b = 8 * this._nDataBytes,
e = 8 * a.sigBytes;
d[e >>> 5] |= 128 << 24 - e % 32;
d[(e + 64 >>> 9 << 4) + 14] = h.floor(b / 4294967296);
d[(e + 64 >>> 9 << 4) + 15] = b;
a.sigBytes = 4 * d.length;
this._process();
return this._hash
},
clone: function () {
var a = q.clone.call(this);
a._hash = this._hash.clone();
return a
}
});
s.SHA256 = q._createHelper(f);
s.HmacSHA256 = q._createHmacHelper(f)
})(Math);
(function () {
var h = CryptoJS,
s = h.enc.Utf8;
h.algo.HMAC = h.lib.Base.extend({
init: function (f, g) {
f = this._hasher = new f.init;
"string" == typeof g && (g = s.parse(g));
var h = f.blockSize,
m = 4 * h;
g.sigBytes > m && (g = f.finalize(g));
g.clamp();
for (var r = this._oKey = g.clone(), l = this._iKey = g.clone(), k = r.words, n = l.words, j = 0; j < h; j++) k[j] ^= 1549556828, n[j] ^= 909522486;
r.sigBytes = l.sigBytes = m;
this.reset()
},
reset: function () {
var f = this._hasher;
f.reset();
f.update(this._iKey)
},
update: function (f) {
this._hasher.update(f);
return this
},
finalize: function (f) {
var g =
this._hasher;
f = g.finalize(f);
g.reset();
return g.finalize(this._oKey.clone().concat(f))
}
})
})();
/*******************************************************************************/
/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function () {
var h = CryptoJS,
j = h.lib.WordArray;
h.enc.Base64 = {
stringify: function (b) {
var e = b.words,
f = b.sigBytes,
c = this._map;
b.clamp();
b = [];
for (var a = 0; a < f; a += 3)
for (var d = (e[a >>> 2] >>> 24 - 8 * (a % 4) & 255) << 16 | (e[a + 1 >>> 2] >>> 24 - 8 * ((a + 1) % 4) & 255) << 8 | e[a + 2 >>> 2] >>> 24 - 8 * ((a + 2) % 4) & 255, g = 0; 4 > g && a + 0.75 * g < f; g++) b.push(c.charAt(d >>> 6 * (3 - g) & 63));
if (e = c.charAt(64))
for (; b.length % 4;) b.push(e);
return b.join("")
},
parse: function (b) {
var e = b.length,
f = this._map,
c = f.charAt(64);
c && (c = b.indexOf(c), -1 != c && (e = c));
for (var c = [], a = 0, d = 0; d <
e; d++)
if (d % 4) {
var g = f.indexOf(b.charAt(d - 1)) << 2 * (d % 4),
h = f.indexOf(b.charAt(d)) >>> 6 - 2 * (d % 4);
c[a >>> 2] |= (g | h) << 24 - 8 * (a % 4);
a++
}
return j.create(c, a)
},
_map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
}
})();