partialCallbacks = {}; selections = {}; copyText = (text, message, alert) => { navigator.clipboard.writeText(text).then(() => { (alert !== false) && $alert.notify({ type: 'success', title: 'Clipboard', message: (message || 'Text copied to clipboard.'), toast: true, }); }); }; share = (details) => navigator.share($utilities.deepCopy(details)); comingSoon = () => { $alert.notify({ type: 'info', title: 'Feature coming soon', message: 'This feature is currently not available.', toast: true, }); }; transformPathwayOptions = (options) => { let transformed = []; (options || studyProvinces).forEach((item) => { let shareKey = ''; for (let i = 0; i < item.name.length; i++){ shareKey = item.name.at(i); if (shareKey == ' '){ continue; } shareKey = shareKey.toLowerCase(); if (transformed.length == 0 || !transformed.find(opt => opt.share_key === shareKey)){ break; } } transformed.push({ share_key: shareKey, label: item.name, }); }); return transformed; }; studyProvinces = [ { name: 'Alberta', is_good: true, }, { name: 'British Columbia', is_good: false, }, { name: 'Manitoba', is_good: true, }, { name: 'New Brunswick', is_good: true, }, { name: 'Newfoundland and Labrador', is_good: true, }, { name: 'Northwest Territories', is_good: false, }, { name: 'Nunavut', is_good: false, }, { name: 'Ontario', is_good: false, }, { name: 'Prince Edward Island', is_good: true, }, { name: 'Quebec', is_good: false, }, { name: 'Saskatchewan', is_good: true, }, { name: 'Yukon', is_good: false, }, ]; prOccupations = [ { name: 'French-language proficiency', show: false, }, { name: 'Healthcare occupations', show: true, }, { name: 'Science, Technology, Engineering and Math (STEM) occupations', show: true, }, { name: 'Trade occupations', show: true, }, { name: 'Transport occupations', show: true, }, { name: 'Agriculture and Agri-food occupations', show: true, }, ]; targets = {}; addTarget = (key, el, setDefault = false, title = null) => { const scope = $$scope(this.parentElement); scope.targets[key] = { el, title }; setDefault && scope.setDefault(key); }; removeTarget = (key) => { const scope = $$scope(this.parentElement); delete scope.targets[key]; scope.removeDefault(key); }; setDefault = (key) => $$scope(this.parentElement).defaultKey = key; removeDefault = (key) => { const scope = $$scope(this.parentElement); scope.defaultKey === key && (scope.defaultKey = null); }; getAvailableKeys = () => { const map = {}; Object.entries($$scope(this.parentElement).targets).map(([key, value]) => (map[key] = value.title || key)); return map; }; capture = (target) => { if (typeof performCapture === 'function'){ return performCapture(target); } performCapture = true; awaitingTarget = target; return new window.Promise((resolve, reject) => { awaiting = (res) => { if (res === false){ reject(); } else{ resolve(res); } }; }); };

Generating downloadable file...

const title = ({"value":"Portify"}).value; document.title = `${title} | Shirah`;

Portify

Work with a licensed Canadian immigration consultant

Portify is Shirah's immigration marketplace. It connects applicants and employers with vetted, licensed Canadian immigration consultants, and gives everyone involved one place to run the case from first enquiry to decision.

For applicants

Browse verified professionals, compare services and pricing before you commit, and track your case in one place. Pricing is agreed up front, so you know what you are paying before any work begins.

For employers

Hire international talent with consultant support through the LMIA and work permit process, with documents, deadlines and correspondence kept together rather than scattered across inboxes.

For consultants

Run your practice on one platform: case management, client communication, document collection and payments, without stitching together separate tools.

checkpoint = 0; target = document.querySelector('#modal-mount'); targetParent = target.parentElement; targetParent.style.display = 'none'; setVisible = (show) => { if (show != isVisible){ isVisible = show; targetParent.style.display = (show ? 'flex' : 'none'); $$class(document.body).toggleOn(show, 'overflow-hidden'); } if (show && duration){ const cp = ++checkpoint; window.setTimeout(() => cp == checkpoint && hide(), duration); } }; init = (options) => { options = options || {}; disableParentClick = options.disableParentClick || false; duration = options.duration || 0; ++checkpoint; !options.hidden && show(); }; show = () => setVisible(true); hide = () => setVisible(false); toggleVisible = () => setVisible(!isVisible); onEntered = () => { aIndex = 0; loading = true; target.style.display = 'none'; show(); }; onLoad = () => { loading = false; target.style.display = 'flex'; }; onReload = () => onLoad(); $event.target === targetParent && !disableParentClick && hide();
show = false; show = false; show = !show; if (show && !$static(shown)){ shown = true; $nextTick(() => $refs.menu.focus()); } else{ shown = false; }

Sign in to access this feature

if ($event.detail.data && $event.detail.data.otp){ otpEmail = $event.detail.data.email; $router.goto('r6o8U5qJBnSK0WeSMMqW://otp'); } else{ window.location.href = ({"value":"\/headed\/objects"}).value; }
onProgress = (progress, isComplete) => { percentage = $rel.lt(progress, 1) ? progress * 100 : 100; if (isComplete && isActive){ const chkpt = (checkpoint = (checkpoint || 0) + 1); window.setTimeout(() => (chkpt === checkpoint && (isActive = false)), 500); } else if (!isComplete && !isActive){ isActive = true; } };